package org.bjf.config;

import java.io.IOException;
import javax.sql.DataSource;
import org.flowable.engine.ProcessEngineConfiguration;
import org.flowable.spring.SpringProcessEngineConfiguration;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;

/**
 * flowable 流程配置: 一个配置对象，一个引擎对象，七大服务
 *
 * RepositoryService：提供一系列管理流程部署和流程定义的API。 RuntimeService：在流程运行时对流程实例进行管理与控制。
 * TaskService：对流程任务进行管理，例如任务提醒、任务完成和创建任务等。 IdentityService：提供对流程角色数据进行管理的API，这些角色数据包括用户组、用户及它们之间的关系。
 * ManagementService：提供对流程引擎进行管理和维护的服务。 HistoryService：对流程的历史数据进行操作，包括查询、删除这些历史数据。
 * FormService：表单服务。
 *
 * @author binjinfeng
 */
@Configuration
public class ProcessConfig {

  /**
   * 初始化配置，将创建28张表
   */
  @Bean
  public SpringProcessEngineConfiguration processEngineConfiguration(
      @Qualifier("userDataSource") DataSource dataSource, @Qualifier("userTransactionManager")
      DataSourceTransactionManager transactionManager) throws IOException {
    Resource[] resources = new PathMatchingResourcePatternResolver()
        .getResources(ResourceLoader.CLASSPATH_URL_PREFIX + "processes/*.bpmn20.xml");

    SpringProcessEngineConfiguration cfg = new SpringProcessEngineConfiguration();
    cfg.setDataSource(dataSource);
    // 使用uuid
//    cfg.setIdGenerator(new StrongUuidGenerator());
    cfg.setTransactionManager(transactionManager);
    // 自动部署开关
    cfg.setDeploymentResources(resources);
    cfg.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
    cfg.setAsyncExecutorActivate(Boolean.FALSE);
    cfg.setActivityFontName("宋体");
    cfg.setLabelFontName("宋体");
    cfg.setAnnotationFontName("宋体");
    return cfg;
  }


}
